package at.ac.tuwien.vpsbcm.spielzeugfabrik.gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.UIManager;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;

import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.DefaultComboBoxModel;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.BauteilEnum;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.BauteilTableModel;

import javax.swing.border.TitledBorder;
import javax.swing.JList;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JCheckBox;

/**
 * @author Andreas Wolf
 *
 */

public class GUIMain {

	public JFrame frmGui;
	private JTextField textAnzahl;
	protected JComboBox<BauteilEnum> comboBauteil;
	protected int lastProduzentId;
	protected String GUITitle;
	protected JTable tableBauteile;
	protected JTable tableVerbauteBauteile;
	protected BauteilTableModel BauteileTableModelobj;
	protected BauteilTableModel VerbauteBauteileTableModelobj;
	protected JList<String> listFertigeLoks;
	protected JList<String> listAusgelieferteLoks;
	protected JList<String> listAuftrag;
	protected DefaultListModel<String> FertigeLoksListModelobj;
	protected DefaultListModel<String> AusgelieferteLoksListModelobj;
	protected DefaultListModel<String> GetesteteLoksListModelobj;
	protected DefaultListModel<String> FehlerhafteLoksListModelobj;
	protected DefaultListModel<String> AuftragListModelobj;
	protected JTextField textFehler;
	protected JTextField txtFarbe;
	protected JTextField textAuftragAnz;
	protected JCheckBox checkBoxSchornstein;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GUIMain window = new GUIMain();
					window.frmGui.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public GUIMain() {
		this.GUITitle = "Default GUI";
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	protected void initialize() {
		lastProduzentId = 0;
		frmGui = new JFrame();
		frmGui.setTitle(this.GUITitle);
		frmGui.setBounds(100, 100, 500, 300);
		frmGui.setMinimumSize(new Dimension(1000, 500));
		frmGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmGui.getContentPane().setLayout(new BorderLayout(0, 0));
		
		JPanel panelNeuerProduzent = new JPanel();
		panelNeuerProduzent.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		frmGui.getContentPane().add(panelNeuerProduzent, BorderLayout.WEST);
		panelNeuerProduzent.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("40dlu:grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("75dlu:grow"),
				FormFactory.RELATED_GAP_COLSPEC,},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.LINE_GAP_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,}));
		
		JLabel lblBauteil = new JLabel("Bauteil");
		panelNeuerProduzent.add(lblBauteil, "2, 2, left, center");
		
		comboBauteil = new JComboBox<BauteilEnum>();
		comboBauteil.setModel(new DefaultComboBoxModel<BauteilEnum>(BauteilEnum.values()));
		panelNeuerProduzent.add(comboBauteil, "4, 2, fill, default");
		
		JLabel lblAnzahl = new JLabel("Anzahl");
		panelNeuerProduzent.add(lblAnzahl, "2, 4, left, default");
		
		textAnzahl = new JTextField();
		textAnzahl.setText("1");
		panelNeuerProduzent.add(textAnzahl, "4, 4, fill, default");
		textAnzahl.setColumns(10);
		
		JButton btnNeuerProduzent = new JButton("Neuer Produzent");
		btnNeuerProduzent.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					int anzahl, fehlerrate;
					try {
						anzahl = Integer.parseInt(textAnzahl.getText());
						textAnzahl.setBackground(UIManager.getColor("TextField.background"));
					} catch (NumberFormatException e) {
						textAnzahl.setBackground(Color.RED);
						throw e;
					}
					try {
						fehlerrate = Integer.parseInt(textFehler.getText());
						textFehler.setBackground(UIManager.getColor("TextField.background"));
					} catch (NumberFormatException e) {
						textFehler.setBackground(Color.RED);
						throw e;
					}
					if (fehlerrate >= 0 && fehlerrate <= 100) {
						starteProduzent (lastProduzentId, (BauteilEnum)comboBauteil.getSelectedItem(), anzahl, fehlerrate);
						lastProduzentId++;
					} else {
						textFehler.setBackground(Color.RED);
					}
					
				} catch (NumberFormatException e) {
					
					
				}
			}
		});
		
		JLabel lblFehlerrate = new JLabel("Fehlerrate");
		panelNeuerProduzent.add(lblFehlerrate, "2, 6, left, default");
		
		textFehler = new JTextField();
		textFehler.setText("0");
		panelNeuerProduzent.add(textFehler, "4, 6, fill, default");
		textFehler.setColumns(10);
		panelNeuerProduzent.add(btnNeuerProduzent, "4, 8");
		
		JSeparator separator = new JSeparator();
		panelNeuerProduzent.add(separator, "2, 10, 3, 1");
		
		JLabel lblFarbe = new JLabel("Farbe");
		panelNeuerProduzent.add(lblFarbe, "2, 12, left, default");
		
		txtFarbe = new JTextField();
		txtFarbe.setText("rot");
		panelNeuerProduzent.add(txtFarbe, "4, 12, fill, default");
		txtFarbe.setColumns(10);
		
		JLabel lblSchornstein = new JLabel("Schornstein");
		panelNeuerProduzent.add(lblSchornstein, "2, 14, left, default");
		
		checkBoxSchornstein = new JCheckBox("");
		panelNeuerProduzent.add(checkBoxSchornstein, "4, 14");
		
		JLabel lblAuftragAnz = new JLabel("Anzahl");
		panelNeuerProduzent.add(lblAuftragAnz, "2, 16, left, default");
		
		textAuftragAnz = new JTextField();
		textAuftragAnz.setText("1");
		panelNeuerProduzent.add(textAuftragAnz, "4, 16, fill, default");
		textAuftragAnz.setColumns(10);
		
		JButton btnNeuerAuftrag = new JButton("Neuer Auftrag");
		btnNeuerAuftrag.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					int anzahl;
					try {
						anzahl = Integer.parseInt(textAuftragAnz.getText());
						textAuftragAnz.setBackground(UIManager.getColor("TextField.background"));
					} catch (NumberFormatException e1) {
						textAnzahl.setBackground(Color.RED);
						throw e1;
					}
					if (txtFarbe.getText().equals("")) {
						txtFarbe.setBackground(Color.RED);
					} else {
						txtFarbe.setBackground(UIManager.getColor("TextField.background"));
						neuerAuftrag(anzahl, checkBoxSchornstein.isSelected(), txtFarbe.getText());
					}
					
				} catch (NumberFormatException e1) {
					
					
				}
			}
		});
		panelNeuerProduzent.add(btnNeuerAuftrag, "4, 18");
		
		JPanel panelStatus = new JPanel();
		frmGui.getContentPane().add(panelStatus, BorderLayout.CENTER);
		panelStatus.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(100dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.MIN_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(50dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.MIN_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(50dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),
				FormFactory.UNRELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),
				FormFactory.UNRELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),
				FormFactory.RELATED_GAP_ROWSPEC,}));
		
		JLabel lblBauteile = new JLabel("Bauteile");
		panelStatus.add(lblBauteile, "2, 2, left, default");
		
		JLabel lblFertigeLoks = new JLabel("Fertige Loks");
		panelStatus.add(lblFertigeLoks, "6, 2, left, default");
		
		JSeparator separator1 = new JSeparator();
		separator1.setOrientation(SwingConstants.VERTICAL);
		panelStatus.add(separator1, "4, 2, 1, 7, default, fill");
		
		
		BauteileTableModelobj = new BauteilTableModel ();
		/*BauteileTableModelobj.addRow(new Object [] {1,1,"test","bla",1234});
		BauteileTableModelobj.addRow(new Object [] {1,2,"test2","bla",56});
		BauteileTableModelobj.removeRow(0);
		int row = BauteileTableModelobj.getBauteilRow (1,1);
		BauteileTableModelobj.removeRow(row); */
		
		FertigeLoksListModelobj = new DefaultListModel<String>();
		GetesteteLoksListModelobj = new DefaultListModel<String>();
		FehlerhafteLoksListModelobj = new DefaultListModel<String>();
		
		JSeparator separator2 = new JSeparator();
		separator2.setOrientation(SwingConstants.VERTICAL);
		panelStatus.add(separator2, "8, 2, 1, 7, default, fill");
		
		AusgelieferteLoksListModelobj = new DefaultListModel<String>();
		
		JLabel lblGetesteteLoks = new JLabel("Getestete Loks");
		panelStatus.add(lblGetesteteLoks, "10, 2");
		
		JScrollPane scrollPaneBauteile = new JScrollPane();
		panelStatus.add(scrollPaneBauteile, "2, 4, fill, fill");
		tableBauteile = new JTable();
		scrollPaneBauteile.setViewportView(tableBauteile);
		tableBauteile.setEnabled(false);
		tableBauteile.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		tableBauteile.setRowSelectionAllowed(false);
		tableBauteile.setModel(BauteileTableModelobj);
		tableBauteile.getColumnModel().getColumn(0).setPreferredWidth(60);
		tableBauteile.getColumnModel().getColumn(1).setPreferredWidth(60);
		panelStatus.add(tableBauteile.getTableHeader(), "2, 4, 1, 2, fill, fill");
		listFertigeLoks = new JList<String>();
		listFertigeLoks.setModel(FertigeLoksListModelobj);
		listFertigeLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		listAusgelieferteLoks = new JList<String>();
		listAusgelieferteLoks.setModel(AusgelieferteLoksListModelobj);
		listAusgelieferteLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		
		JScrollPane scrollPaneFertigeLoks = new JScrollPane();
		panelStatus.add(scrollPaneFertigeLoks, "6, 4, fill, fill");
		scrollPaneFertigeLoks.setViewportView(listFertigeLoks);
		
		JScrollPane scrollPaneGetesteteLoks = new JScrollPane();
		panelStatus.add(scrollPaneGetesteteLoks, "10, 4, fill, fill");
		
		JList<String> listGetesteteLoks = new JList<String>();
		listGetesteteLoks.setModel(GetesteteLoksListModelobj);
		listGetesteteLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		scrollPaneGetesteteLoks.setViewportView(listGetesteteLoks);
		
		JLabel lblFehlerhafteLoks = new JLabel("Fehlerhafte Loks");
		panelStatus.add(lblFehlerhafteLoks, "6, 6");
		
		JScrollPane scrollPaneFehlerhafteLoks = new JScrollPane();
		panelStatus.add(scrollPaneFehlerhafteLoks, "6, 8, fill, fill");
		
		JList<String> listFehlerhafteLoks = new JList<String>();
		listFehlerhafteLoks.setModel(FehlerhafteLoksListModelobj);
		listFehlerhafteLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		scrollPaneFehlerhafteLoks.setViewportView(listFehlerhafteLoks);
		
		JScrollPane scrollPaneAusgelieferteLoks = new JScrollPane();
		panelStatus.add(scrollPaneAusgelieferteLoks, "10, 8, fill, fill");
		scrollPaneAusgelieferteLoks.setViewportView(listAusgelieferteLoks);
		
		JLabel lblVerbauteBauteile = new JLabel("Verbaute Bauteile");
		panelStatus.add(lblVerbauteBauteile, "2, 6");
		
		JLabel lblAusgelieferteLoks = new JLabel("Ausgelieferte Loks");
		panelStatus.add(lblAusgelieferteLoks, "10, 6, left, default");
		
		JScrollPane scrollPaneVerbauteBauteile = new JScrollPane();
		panelStatus.add(scrollPaneVerbauteBauteile, "2, 8, fill, fill");

		VerbauteBauteileTableModelobj = new BauteilTableModel ();
		
		tableVerbauteBauteile = new JTable();
		tableVerbauteBauteile.setEnabled(false);
		tableVerbauteBauteile.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		tableVerbauteBauteile.setRowSelectionAllowed(false);
		tableVerbauteBauteile.setModel(VerbauteBauteileTableModelobj);
		tableVerbauteBauteile.getColumnModel().getColumn(0).setPreferredWidth(60);
		tableVerbauteBauteile.getColumnModel().getColumn(1).setPreferredWidth(60);
		panelStatus.add(tableBauteile.getTableHeader(), "2, 4, 1, 2, fill, fill");
		scrollPaneVerbauteBauteile.setViewportView(tableVerbauteBauteile);
		
		JLabel lblAuftrge = new JLabel("Auftr\u00E4ge");
		panelStatus.add(lblAuftrge, "2, 10");
		
		JScrollPane scrollPaneAuftrag = new JScrollPane();
		panelStatus.add(scrollPaneAuftrag, "2, 12, 9, 1, fill, fill");
		
		AuftragListModelobj = new DefaultListModel<String>();
		listAuftrag = new JList<String>();
		listAuftrag.setModel(AuftragListModelobj);
		listAuftrag.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		scrollPaneAuftrag.setViewportView(listAuftrag);
	}
	protected void neuerAuftrag(int anzahl, boolean selected, String text) {
		// TODO Auto-generated method stub
		
	}

	protected void starteProduzent(int id, BauteilEnum bauteil, int anzahl, int fehlerrate) {
		System.out.println("Starte Produzent mit ID" + (id) + ", Bauteil " + (bauteil) + ", Anzahl " + (anzahl) + ", Fehlerrate " + (fehlerrate));
		// diese Methode wird in der jeweiligen L�sung �berladen	
	}
	

}
